home *** CD-ROM | disk | FTP | other *** search
/ Stolen Data 1 / Stolen Data 1.adf / Source / Sine_bobs.s < prev   
Text File  |  1989-11-02  |  8KB  |  373 lines

  1.     Incdir    Df1:
  2.     Include    Source/CustomRegisters
  3.  
  4. ;-- CustomRegisters is an include file which defines all the custom
  5. ;-- chip registers I use and also creates three macros which make
  6. ;-- creating copperlists much easier ( Mov, Wait, Skip )
  7.  
  8. *************************************************************************
  9. *****    Sorry but these examples will only work with DEVPAC II    ******
  10. *****    despite what I said in the magazine                       ******
  11. *************************************************************************
  12.  
  13. Ciaapra        = $BFE001    ;CIA port a register, bit 6 is used for
  14.                 ;the left mouse button, and bit 1 toggles
  15.                 ;the power LED which is connected to the
  16.                 ;low pass filter
  17. Oldopenlibrary    = -$198        ;Open a library of functions, a pointer
  18.                 ;to the library name is sent in a1,
  19.                 ;ignores the library version no.
  20. Disable        = -$78        ;Switch off interrupts,and multitasking
  21.                 ;( taskswitching occurs in the vertical
  22.                 ;blanking interrupt )
  23. Enable        = -$7e        ;Enable interrupts,including multitasking
  24. Startlist    = 38        ;The standard workbench copperlist.
  25. Execbase    = 4        ;A pointer to the EXEC library which
  26.                 ;contains all the fundamental operating
  27.                 ;system routines.
  28.  
  29.     Move.l    Execbase,a6
  30.     Jsr    Disable(a6)    ;Disable interrupts
  31.     Bsr    Setup
  32.  
  33.  
  34. ;------ Wait for Vertical position 1 --------
  35.  
  36. Wait    Move.l    Vposr,d2
  37.     And.l    #$0001ff00,d2
  38.     Cmp.l    #$00000000,d2
  39.     Bne.s    Wait
  40.  
  41.     Bsr    Main
  42.  
  43.     Btst    #6,Ciaapra    ;Have you pressed the left button
  44.     Bne.s    Wait
  45.  
  46. ;------ Restore old Copper list -----------
  47.  
  48.     Move.l    Execbase,a6
  49.     Move.l    #Grname,a1
  50.     Clr.l    d0
  51.     Jsr    Oldopenlibrary(a6)    ;Open the graphics library
  52.     Move.l    d0,a4
  53.     Move.l    Startlist(a4),Cop1lc    ;Restore the old copperlist
  54.     Clr.w    Copjmp1
  55.     Move.w    #$83E0,Dmacon
  56.     Jsr    Enable(a6)        ;Re-enable the interrupts
  57.     Clr.l    d0            ;No return-code errors
  58.     Rts
  59.  
  60. ;-------- Setup routine ----------
  61.  
  62. Setup
  63.     Move.w    #$8780,Dmacon    ;Make sure copper,blitter DMA is on
  64.     Move.w    #$0020,Dmacon    ;Turn off sprite DMA
  65.  
  66.     Lea    Spr0data,a0    ;Now clear all sprite data to eliminate
  67.     Moveq    #7,d0        ;the lines you occasionaly get if you
  68. Spr_clr                ;forget to do this.
  69.     Clr.l    (a0)
  70.     Addq.l    #8,a0
  71.     Dbf    d0,Spr_clr
  72.  
  73. ;-- Clear the screen
  74.  
  75.     Lea    $70000,a0
  76.     Move    #$1fff,d0
  77. Clr_scr
  78.     Clr.l    (a0)+
  79.     Dbf    d0,Clr_scr
  80.  
  81. ;-- Create the mask
  82.  
  83.     Lea    Bob_data(pc),a0
  84.     Lea    Width(a0),a1
  85.     Lea    Bob_mask(pc),a2
  86.     Lea    Width(a2),a3
  87.  
  88.     Move    #Length-1,d1
  89. Mask_loop2
  90.     Move    #Width/2-1,d0
  91. Mask_loop1
  92.     Move    (a0)+,d2    ;Or the seperate bitplanes of the bob
  93.     Or    (a1)+,d2    ;to determine its outline for the mask
  94.     Move    d2,(a2)+
  95.     Move    d2,(a3)+
  96.     Dbf    d0,Mask_loop1
  97.  
  98.     Lea    Width(a0),a0
  99.     Lea    Width(a1),a1
  100.     Lea    Width(a2),a2
  101.     Lea    Width(a3),a3
  102.     Dbf    d1,Mask_loop2
  103.     
  104.     Move.l    #Clstart,Cop1lc        ;Start up my own copperlist
  105.     Clr    Copjmp1
  106.     Rts
  107.  
  108. ;----- Wait for the blitter to finish -----
  109.  
  110. Blit_wait
  111.     Btst    #14,Dmaconr
  112.     Bne.s    Blit_wait
  113.     Rts
  114.  
  115. ;--------- The main demo routine ----------
  116. Main
  117. ;-- Double buffer the pointers and screens
  118. ;- Screen1 = $70000 , Screen2 = $74000
  119.  
  120.     Eor    #$4000,Bob_scr+2
  121.     Eor    #$4000,Plane1+2
  122.     Eor    #$4000,Plane2+2
  123.     Move.l    Xa(pc),d0    ;Swap the sine pointer
  124.     Move.l    Xb(pc),Xa    ;tables
  125.     Move.l    d0,Xb
  126.     Move.l    Ya(pc),d0
  127.     Move.l    Yb(pc),Ya
  128.     Move.l    d0,Yb
  129.  
  130. ;-- Clear the previous bobs
  131.  
  132.     Move.l    Xa(pc),a3
  133.     Move.l    Ya(pc),a4
  134.     Moveq    #$46,d7        ;36 bobs
  135. Clear_bobs
  136.     Move    (a3,d7),d0
  137.     Move    (a4,d7),d1
  138.     Bsr    Bob_clr
  139.     Subq    #2,d7
  140.     Bpl.s    Clear_bobs
  141.  
  142. ;-- Calculate the new sine-positions
  143.  
  144.     Bsr    Sine_calc
  145.  
  146. ;-- Now plot the bobs in their new positions
  147.  
  148.     Moveq    #$46,d7
  149.     Move.l    Xa(pc),a3
  150.     Move.l    Ya(pc),a4
  151. Draw_bobs
  152.     Move    (a3,d7),d0
  153.     Move    (a4,d7),d1
  154.     Bsr    Bob_draw
  155.     Subq    #2,d7
  156.     Bpl.s    Draw_bobs
  157.  
  158.     Rts
  159.  
  160. ;--------- Sine bob calculate ---------
  161. ; This is a very slow sine-bob routine, but it is
  162. ; intentional as I think it is easier to understand
  163. ; this way. You will soon find ways of increasing
  164. ; the speed yourself.
  165.  
  166. X_vel1    = 3
  167. X_vel2    = 4
  168. Y_vel1    = 3
  169. Y_vel2    = 2
  170.  
  171. X_add1    = 5
  172. X_add2    = 12
  173. Y_add1    = 7
  174. Y_add2    = 8
  175.  
  176. Sine_calc
  177.     Lea    Sintable(pc),a0
  178.     Move.l    Xa(pc),a3
  179.     Move.l    Ya(pc),a4
  180.  
  181.     Move    X_pt1(pc),d0    ;Update the sine-pointers
  182.     Add    #X_vel1*2,d0
  183.     And    #$1fe,d0
  184.     Move    d0,X_pt1
  185.  
  186.     Move    X_pt2(pc),d1
  187.     Add    #X_vel2*2,d1
  188.     And    #$1fe,d1
  189.     Move    d1,X_pt2
  190.  
  191.     Move    Y_pt1(pc),d2
  192.     Add    #Y_vel1*2,d2
  193.     And    #$1fe,d2
  194.     Move    d2,Y_pt1
  195.  
  196.     Move    Y_pt2(pc),d3
  197.     Add    #Y_vel2*2,d3
  198.     And    #$1fe,d3
  199.     Move    d3,Y_pt2
  200.  
  201.     Moveq    #35,d7
  202. Calc_loop
  203.     Move    (a0,d0),d5    ;The sine-table ranges from -32768
  204.     Move    (a0,d1),d6    ;to 32767
  205.     Asr    d5
  206.     Asr    d6
  207.     Add    d5,d6
  208.     Muls    #(320-Width*8),d6
  209.     Swap    d6
  210.     Add    #(160-Width*4),d6
  211.     Move    d6,(a3)+
  212.  
  213.     Move    (a0,d2),d5
  214.     Move    (a0,d3),d6
  215.     Asr    d5
  216.     Asr    d6
  217.     Add    d5,d6
  218.     Muls    #(200-Length),d6
  219.     Swap    d6
  220.     Add    #(100-Length/2),d6
  221.     Move    d6,(a4)+
  222.  
  223.     Add    #X_add1*2,d0        ;Update the sine_pointers
  224.     And    #$1fe,d0        ;for the next bob
  225.     Add    #X_add2*2,d1
  226.     And    #$1fe,d1
  227.     Add    #Y_add1*2,d2
  228.     And    #$1fe,d2
  229.     Add    #Y_add2*2,d3
  230.     And    #$1fe,d3
  231.  
  232.     Dbf    d7,Calc_loop
  233.     Rts
  234.  
  235. ;--------- Bob routine ----------
  236. Width        = 6
  237. Length        = 31
  238. Bob_pt        Dc.l Bob_data
  239. Msk_pt        Dc.l Bob_mask
  240. Bob_scr        Dc.l $74000
  241. Scr_width    = 40
  242. No_pln        = 2        ;Number of screen bitplanes
  243.  
  244. ;-- Put x,y coordinate in d0,d1 respectively
  245.  
  246. Bob_draw
  247.     Move    d0,d2
  248.     Lsr    #4,d0
  249.     Add    d0,d0        ;Find which word to start drawing the bob on
  250.     Mulu    #80,d1        ;Find the screenline to start
  251.                     ;drawing the bob
  252.     Add    d1,d0
  253.     Move.l    Bob_scr(pc),a0        ;Start of the screen
  254.     Lea    (a0,d0),a0        ;a0 now has the first word to which
  255.                     ;we want to copy the bob
  256.     Bsr    Blit_wait
  257.     Move.l    a0,Bltdpth
  258.     Move.l    a0,Bltcpth        ;Ch.C reads the screen data
  259.     Move.l    Bob_pt(pc),Bltapth    ;Ch.A is used for the bob data
  260.     Move.l    Msk_pt(pc),Bltbpth    ;Ch.B used for the mask,only A&B
  261.                     ;can be shifted remember
  262.     Move.l    #$ffff0000,Bltafwm    ;Mask out the last word from A
  263.     Clr    Bltamod
  264.     Clr    Bltbmod
  265.     Move    #Scr_width-Width,Bltcmod    ;Move on to next screen
  266.     Move    #Scr_width-Width,Bltdmod    ;line
  267.  
  268.     And    #$0f,d2
  269.     Ror    #4,d2
  270.     Move    d2,d0
  271.     Swap    d0
  272.     Move    d2,d0            ;This gets the A-B shift value into
  273.                     ;the right place
  274.     Or.l    #$fe20000,d0        ;Use all 4 channels and set the
  275.                     ;minterms for bob use.
  276.     Move.l    d0,Bltcon0
  277.     Move    #Length*No_pln*64+Width/2,Bltsize    ;Blit the bob
  278.  
  279.     Rts        ;This bob routine is not particularly fast
  280.             ;for instance in a demo you would create tables
  281.             ;for x,y position conversions, also some of the
  282.             ;blitter registers do not need to be changed
  283.             ;when plotting a new bob, but as this is supposed
  284.             ;to be a general bob routine I left these
  285.             ;optimisations out. See the 196 bob source for
  286.             ;an example of how far you can take this. Also
  287.             ;I have not used double buffering which is
  288.             ;essential for a large number of bobs.
  289.  
  290. Bob_clr
  291.     Move    d0,d2
  292.     Lsr    #4,d0
  293.     Add    d0,d0
  294.     Mulu    #80,d1
  295.  
  296.     Add    d1,d0
  297.     Move.l    Bob_scr(pc),a0
  298.     Lea    (a0,d0),a0
  299.  
  300.     Bsr    Blit_wait
  301.     Move.l    a0,Bltdpth
  302.     Move    #Scr_width-Width,Bltdmod
  303.     Clr    Bltadat
  304.     Move.l    #$1f00000,Bltcon0
  305.     Move    #Length*No_pln*64+Width/2,Bltsize
  306.  
  307.     Rts
  308. ;--------- Constants -----------
  309.  
  310. Grname    Dc.b    "graphics.library",0
  311.  
  312.     Even
  313.  
  314. ;--------- Variables -----------
  315.  
  316. Pointer    Dc.w 0
  317. X_pt1    Dc.w $80
  318. X_pt2    Dc.w $80
  319. Y_pt1    Dc.w 0
  320. Y_pt2    Dc.w 0
  321.  
  322. Xa    Dc.l Xs1
  323. Xb    Dc.l Xs2
  324. Ya    Dc.l Ys1
  325. Yb    Dc.l Ys2
  326.  
  327. Xs1    Dcb.w 36,0
  328. Ys1    Dcb.w 36,0
  329.  
  330. Xs2    Dcb.w 36,0
  331. Ys2    Dcb.w 36,0
  332.  
  333. ;---------- Copperlists -----------
  334. Clstart
  335.     Wait    0,2
  336.     Mov    $4081,Diwstrt    ;Define the screen window as
  337.     Mov    $08c1,Diwstop    ;320 x 200 starting on line 80
  338.     Mov    $0038,Ddfstrt
  339.     Mov    $00d0,Ddfstop
  340.  
  341.     Mov    0,Bplcon1    ;No scrolling
  342.     Mov    0,Bplcon2    ;Clear bitplane/sprite priorities
  343.  
  344.     Mov    40,Bpl1mod    ;We want the bitplanes to be arranged
  345.     Mov    40,Bpl2mod    ;side by side for faster bob plotting
  346. Plane1
  347.     Mov    0,Bpl1ptl    ;Set the start of the screen
  348.     Mov    7,Bpl1pth    ;memory (must be placed in a
  349. Plane2
  350.     Mov    40,Bpl2ptl    ;copperlist as it needs to be
  351.     Mov    7,Bpl2pth    ;set every frame)
  352.  
  353.     Mov    $2200,Bplcon0    ;We want a 2 Bitplane, single playfield
  354.                 ;screen
  355.  
  356.     Mov    $000,Color00    ;Black background
  357.     Mov    $900,Color01    ;Shades of Red for the balls
  358.     Mov    $800,Color02
  359.     Mov    $600,Color03
  360.  
  361.     Wait    254,255        ;Wait for an impossible position
  362.                 ;tells the copper, this is the end
  363.                 ;of the copperlist
  364.  
  365. ;-------------- Binaries ---------------
  366.  
  367. Bob_data
  368.     Incbin    Binary/Bob
  369. Bob_mask
  370.     Dcb.b    No_pln*Width*Length,0
  371. Sintable
  372.     Incbin    Binary/Sin
  373.